/*
This file is part of La Linea.

La Linea is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

La Linea is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with La Linea.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once
#ifndef FRAMECACHE_H
#define FRAMECACHE_H

#include "globals.h"

#include "Frame.h"
#include "FrameCacheData.h"

#include <vector>

class FrameCache {
public:
	enum CacheMode {VBO, DISPLAY_LISTS};

private:
	std::vector<FrameCacheData*> _pool;
	CacheMode _mode;

	FrameCacheData* buildData(Frame* f);

public:
	FrameCache();
	~FrameCache();

	// Rebuild a frame entry
	void invalidate(Frame* f);
	
	// Draw a cached frame (build the entry if not present in cache)
	void draw(Frame* f, unsigned int options = 0);
	
	// Delete each entry
	void flush();

	// Search for a frame entry in the cache
	bool isInCache(Frame* f);
	
	// Draw a frame entry
	void drawCacheData(FrameCacheData* f);

	// Get an entry
	FrameCacheData* getCacheData(Frame* f);

	// Remove a frame from the cache
	void removeEntry(Frame* f);

	// Set the cache mode and flush the cache
	void setMode(CacheMode c);
};

#endif
